package br.ufg.inf.espweb.sgca.web.controller;

import br.ufg.inf.espweb.sgca.model.Curso;
import br.ufg.inf.espweb.sgca.model.Disciplina;
import br.ufg.inf.espweb.sgca.service.DisciplinaService;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
import lombok.Getter;
import lombok.Setter;
import org.omnifaces.util.Messages;
import org.omnifaces.util.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author diCastro
 */
@Controller("disciplinaCtrl")
@Scope("view")
public class DisciplinaController implements Serializable {
    
    @Autowired
    private DisciplinaService disciplinaService;
    @Autowired
    private CursoController cursoController;
    @Getter
    @Setter
    private Disciplina disciplina;
    private List<Disciplina> disciplinas;
    
    public void adicionarNovaDisciplina(){
        disciplina = new Disciplina();
    }
    
    public void salvarDisciplina(){
        if(disciplina != null){
            boolean continua = true;
            if(disciplina.getCodigo() == null){
                continua = false;
                Messages.addGlobalError("Informe o código da disciplina", "");
            }
            if(Utils.isBlank(disciplina.getNome())){
                continua = false;
                Messages.addGlobalError("Informe o nome do curso", "");
            }
            if(disciplina.getCurso() == null){
                continua = false;
                Messages.addGlobalError("Informe o curso", "");
            }
            if(disciplina.getCargaHorariaTotal().compareTo(BigDecimal.ZERO) <= 0){
                continua = false;
                Messages.addGlobalError("A carga horária total da disciplina deve ser maior que 0 (zero)", "");
            }
            
            if(continua && disciplina.getId() == null){
                disciplinaService.salvar(disciplina);
                disciplinas = null;
                Messages.addGlobalInfo("Disciplina \"{0}\" salva com sucesso!", disciplina.getNome());
                disciplina = null;
            }else if(continua){
                disciplinaService.atualizar(disciplina);
                disciplinas = null;
                Messages.addGlobalInfo("Disciplina \"{0}\" atualizada com sucesso!", disciplina.getNome());
                disciplina = null;
            }
        }
    }
    
    public void cancelarEdicao(){
        disciplina = null;
    }
    
    public void excluirDisciplina(){
        if(disciplina != null && disciplina.getId() != null){
            disciplinaService.remover(disciplina.getId());
            Messages.addGlobalInfo("Disciplina \"{0}\" excluída com sucesso!", disciplina.getNome());
            disciplina = null;
            disciplinas = null;
        }
    }
    
    public List<Disciplina> getDisciplinas() {
        if(Utils.isEmpty(disciplinas))
            disciplinas = disciplinaService.listar();
        
        return disciplinas;
    }
    
    public List<SelectItem> getSelectCursos(){
        List<SelectItem> itens = new ArrayList<SelectItem>();
        
        List<Curso> cursos = cursoController.getCursos();
        itens.add(new SelectItem(null, "Selecione"));
        for(Curso c : cursos){
            itens.add(new SelectItem(c, c.getNome()));
        }
        
        return itens;
    }
}
